/*
 * ImagenesDAO.java
 *
 * Created on 26 de septiembre de 2006, 17:13
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.vozcliente.dao;
import com.src.computec.vozcliente.base.constantes.ConstantesGenerales;
import static com.src.computec.vozcliente.base.constantes.ConstantesGenerales.SCHEMA;
import static com.src.computec.vozcliente.base.constantes.ConstantesGenerales.CODIGO_DANE_VACIO;
import com.src.computec.radar.base.dao.GenericDAO;
import com.src.computec.radar.base.dao.exception.DAOException;
import com.src.computec.radar.base.source.CoreSource;
import com.src.computec.vozcliente.dto.ClienteDto;
import com.src.computec.vozcliente.dto.DepartamentoDto;
import com.src.computec.vozcliente.dto.DetalleVozClienteDto;
import com.src.computec.vozcliente.dto.MunicipioCentroPobladoDto;
import com.src.computec.vozcliente.dto.ProductoDto;
import com.src.computec.vozcliente.dto.VozClienteDto;
import com.src.computec.vozcliente.filethread.FileThread;
import com.src.computec.vozcliente.source.VozClienteSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;


/**
 *
 * @author Jose Luis Perea Alvarez
 */
public class VozClienteDAO extends GenericDAO implements BaseVozClienteDAO {
    
    ConstantesGenerales constantesGenerales = ConstantesGenerales.getInstance();
    
    /** Creates a new instance of CargueDAO */
    public VozClienteDAO() {
    }
    
    public List getClientes() throws DAOException 
    {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try 
        {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT CODIGO_CLIENTE, RAZON_SOCIAL " +
                                             "FROM " + SCHEMA + ".CLIENTE " +
                                             "ORDER BY RAZON_SOCIAL ASC");
            rs = statement.executeQuery();
            
            while (rs.next()) 
            {
                int indice = 0;
                ClienteDto clienteDto = new ClienteDto();
                clienteDto.setCodigoCliente(rs.getString(++indice));
                clienteDto.setRazonSocial(rs.getString(++indice));
                retornoLst.add(clienteDto);
            }
        } 
        catch (SQLException e) {
            throw new DAOException("VozClienteDAO:getClientes: " + e.toString(), e);
        }
        finally {
            closeConnection(con, statement, rs);
        }
        return retornoLst;
    }
    
    public List getProductosByCliente(ClienteDto dto) throws DAOException 
    {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT CODIGO_CLIENTE, CODIGO_PRODUCTO, DESCRIPCION_PRODUCTO " +
                                             "FROM " + SCHEMA + ".PRODUCTO " +
                                             "WHERE CODIGO_CLIENTE = ? " +
                                             "ORDER BY DESCRIPCION_PRODUCTO ASC");
            int indice = 0;
            statement.setObject(++indice, dto.getCodigoCliente());
            rs = statement.executeQuery();
            
            while (rs.next()) 
            {
                int indice1 = 0;
                ProductoDto productoDto = new ProductoDto();
                productoDto.setCodigoCliente(rs.getString(++indice1));
                productoDto.setCodigoProducto(rs.getString(++indice1));
                productoDto.setDescripcionProducto(rs.getString(++indice1));
                retornoLst.add(productoDto);
            }
        } 
        catch (SQLException e) 
        {
            throw new DAOException("VozClienteDAO:getProductosByCliente: " + e.toString(), e);
        }
        finally 
        {
            closeConnection(con, statement, rs);
        }
        return retornoLst;
    }
    
    public boolean existeCargueVozCliente(VozClienteDto dto) throws DAOException
    {
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT CODIGO_VOZ_CLIENTE " +
                                             "FROM " + SCHEMA + ".CARGUE_VOZ_CLIENTE " +
                                             "WHERE CODIGO_CLIENTE = ? AND CODIGO_PRODUCTO = ? AND ANO = ? AND MES = ? AND SEMANA_MES = ? ");
            int indice = 0;
            statement.setObject(++indice, dto.getCodigoCliente());
            statement.setObject(++indice, dto.getCodigoProducto());
            statement.setObject(++indice, dto.getYear());
            statement.setObject(++indice, dto.getMonth());
            statement.setObject(++indice, dto.getMonthWeek());
            rs = statement.executeQuery();
            
            if (rs.next()) 
            {
                return true;
            }
        } 
        catch (SQLException e) 
        {
            throw new DAOException("VozClienteDAO:existeCargueVozCliente: " + e.toString(), e);
        }
        finally 
        {
            closeConnection(con, statement, rs);
        }
        return false;
    }
    
    public int gestionarReclamosVozCliente(VozClienteDto vozClienteDto) throws DAOException
    {
        int inconsistencias = 0;
        String nextIdCargueVozCliente;
        
        Connection con = null;
        PreparedStatement statementInsert = null; //hacer insert
        PreparedStatement statementInsertDetalle = null;
        
        try 
        {
            List reclamosVozClienteLst = vozClienteDto.getReclamosVozCliente();
            int initialSize = reclamosVozClienteLst.size();
            reclamosVozClienteLst = this.encontrarInfoDocumentos(vozClienteDto);
            int actualSize = reclamosVozClienteLst.size();
                
            con = getConnectionDB2();
            statementInsert = con.prepareStatement("INSERT INTO "+ SCHEMA +".CARGUE_VOZ_CLIENTE (CODIGO_VOZ_CLIENTE,CODIGO_CLIENTE,CODIGO_PRODUCTO,CODIGO_RESPONSABLE,ANO,MES,SEMANA_MES,CANTIDAD,FECHA_CARGUE) " +
                                                   "VALUES (?,?,?,?,?,?,?,?,?)");     
            
            statementInsertDetalle = con.prepareStatement("INSERT INTO "+ SCHEMA +".DETALLE_VOZ_CLIENTE (CODIGO_VOZ_CLIENTE,CODIGO_INTERNO_CLIENTE,CODIGO_BARRAS,CODIGO_DEPARTAMENTO,CODIGO_MUNICIPIO,CODIGO_CENTROP,BARRIO_DESTINATARIO,CONTACTO,DESCRIPCION,CODIGO_GESTION) " +
                                                   "VALUES (?,?,?,?,?,?,?,?,?,?)");       
               
            int indice=0;            
            nextIdCargueVozCliente = this.getNextId(con, SCHEMA + ".CARGUE_VOZ_CLIENTE","CODIGO_VOZ_CLIENTE");
            vozClienteDto.setCodigoVozCliente(nextIdCargueVozCliente);
                    
            statementInsert.setObject(++indice, nextIdCargueVozCliente);
            statementInsert.setObject(++indice, vozClienteDto.getCodigoCliente() );
            statementInsert.setObject(++indice, vozClienteDto.getCodigoProducto() );
            statementInsert.setObject(++indice, vozClienteDto.getIdUser() );
            statementInsert.setObject(++indice, vozClienteDto.getYear() );
            statementInsert.setObject(++indice, vozClienteDto.getMonth() );
            statementInsert.setObject(++indice, vozClienteDto.getMonthWeek() );
            statementInsert.setObject(++indice, Integer.valueOf(initialSize) );            
            statementInsert.setObject(++indice, new java.sql.Timestamp( ( new java.util.Date() ).getTime() ));            
            statementInsert.executeUpdate();
            
            Iterator iterDetalles = reclamosVozClienteLst.iterator();
            
            while(iterDetalles.hasNext())
            {
                try
                {
                    DetalleVozClienteDto detalleVozClienteDto = (DetalleVozClienteDto)iterDetalles.next();
                    
                    int indice1 = 0; 
                    statementInsertDetalle.setObject(++indice1, nextIdCargueVozCliente);
                    statementInsertDetalle.setObject(++indice1, detalleVozClienteDto.getCodigoInternoCliente() );
                    statementInsertDetalle.setObject(++indice1, detalleVozClienteDto.getCodigoBarras() );
                    statementInsertDetalle.setObject(++indice1, detalleVozClienteDto.getCodigoDepartamento() );
                    statementInsertDetalle.setObject(++indice1, detalleVozClienteDto.getCodigoMunicipio() );
                    statementInsertDetalle.setObject(++indice1, detalleVozClienteDto.getCodigoCentroP() );
                    statementInsertDetalle.setObject(++indice1, detalleVozClienteDto.getBarrio() );
                    statementInsertDetalle.setObject(++indice1, detalleVozClienteDto.getContacto() ); 
                    statementInsertDetalle.setObject(++indice1, detalleVozClienteDto.getDescripcion()); 
                    statementInsertDetalle.setObject(++indice1, detalleVozClienteDto.getDistribucionExterna()); 
                    statementInsertDetalle.executeUpdate();                    
                }
                catch(SQLException e)
                {
                    System.out.println("VozClienteDAO: gestionarReclamosVozCliente: " + e.toString());
                    e.printStackTrace();
                    actualSize--;
                }
            }
            
            inconsistencias = initialSize - actualSize;
        } 
        catch (SQLException e) 
        {
            throw new DAOException("VozClienteDAO:gestionarReclamosVozCliente: " + e.toString(), e);
        }
        finally 
        {
            closeConnection(null, statementInsertDetalle);
            closeConnection(con, statementInsert);
        }
        return inconsistencias;
    }
   
    private List encontrarInfoDocumentos(VozClienteDto vozClienteDto) throws DAOException
    {
        List retorno = new ArrayList();
        
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, vozClienteDto.getYear().intValue());
        calendar.set(Calendar.MONTH, vozClienteDto.getMonth().intValue() - 1);
        calendar.set(Calendar.WEEK_OF_MONTH, vozClienteDto.getMonthWeek().intValue());
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try 
        {
            Iterator iterDetalle = vozClienteDto.getReclamosVozCliente().iterator();
            
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT D.CODIGO_BARRAS, E.CODIGO_DEPARTAMENTO, E.CODIGO_MUNICIPIO, E.CODIGO_CENTROP, E.BARRIO_DESTINATARIO, E.CODIGO_ULTIMA_GESTION " +
                                             "FROM "+ SCHEMA +".DOCUMENTO D " +
                                             "INNER JOIN "+ SCHEMA +".ENVIO E ON E.CODIGO_BARRAS = D.CODIGO_BARRAS " +
                                             "WHERE D.CODIGO_INTERNO_CLIENTE = ? AND D.CODIGO_CLIENTE = ? AND D.FECHA_PROCESO < ? AND E.CODIGO_PRODUCTO = ? " +
                                             "ORDER BY D.FECHA_PROCESO DESC " +
                                             "FETCH FIRST 1 ROWS ONLY ");
            
            while(iterDetalle.hasNext())
            {
                try
                {
                    DetalleVozClienteDto detalleVozClienteDto = (DetalleVozClienteDto)iterDetalle.next();
                    
                    int indice = 0;
                    statement.setObject(++indice, detalleVozClienteDto.getCodigoInternoCliente());
                    statement.setObject(++indice, vozClienteDto.getCodigoCliente());
                    statement.setObject(++indice, new java.sql.Date( calendar.getTimeInMillis() ) );
                    statement.setObject(++indice, vozClienteDto.getCodigoProducto());
                    rs = statement.executeQuery();

                    if (rs.next()) 
                    {
                        int indice1 = 0;
                        detalleVozClienteDto.setCodigoBarras(rs.getString(++indice1));
                        detalleVozClienteDto.setCodigoDepartamento(rs.getString(++indice1) != null ? rs.getString(indice1): CODIGO_DANE_VACIO);
                        detalleVozClienteDto.setCodigoMunicipio(rs.getString(++indice1) != null ? rs.getString(indice1): CODIGO_DANE_VACIO);
                        detalleVozClienteDto.setCodigoCentroP(rs.getString(++indice1) != null ? rs.getString(indice1): CODIGO_DANE_VACIO);
                        detalleVozClienteDto.setBarrio(rs.getString(++indice1) != null ? rs.getString(indice1): "");
                        detalleVozClienteDto.setDistribucionExterna(rs.getString(++indice1));
                        retorno.add(detalleVozClienteDto);
                    }
                }
                catch(SQLException e)
                {
                    System.out.println("VozClienteDAO: encontrarInfoDocumentos: " + e.toString());
                    e.printStackTrace();
                }
            }
        } 
        catch (SQLException e) 
        {
            throw new DAOException("VozClienteDAO:encontrarInfoDocumentos: " + e.toString(), e);
        }
        finally 
        {
            closeConnection(con, statement, rs);
        }
        return retorno;
    }
    
    public List getReclamosVozClienteByFilter(VozClienteDto vozClienteDto) throws DAOException
    {
        VozClienteSource vozClienteSource = VozClienteSource.getInstance();
        List retorno = new ArrayList();
        
        Connection con = null;
        PreparedStatement statement = null;
        PreparedStatement statement2 = null;
        ResultSet rs = null;
        ResultSet rs2 = null;
        
        try 
        {
            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            /////// Para sacar el filtro de depto
            String filterDepto = "";
            if(vozClienteDto.getCodigoDepartamento() != null && !vozClienteDto.getCodigoDepartamento().equals(""))
            {
                filterDepto += "AND DVC.CODIGO_DEPARTAMENTO = " + vozClienteDto.getCodigoDepartamento() + " ";
                
                if( vozClienteDto.getCodigoMunicipio() != null && !vozClienteDto.getCodigoMunicipio().equals("") && 
                vozClienteDto.getCodigoCentroP() != null && !vozClienteDto.getCodigoCentroP().equals("") )
                {
                    filterDepto += "AND DVC.CODIGO_MUNICIPIO = " + vozClienteDto.getCodigoMunicipio() + 
                                   " AND DVC.CODIGO_CENTROP = " + vozClienteDto.getCodigoCentroP() + " ";
                }
            }
            
            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            /////// Para el ordenamiento
            String orderBy = "ORDER BY D.NOMBRE_DEPARTAMENTO, CP.NOMBRE_CENTRO_POBLADO, DVC.BARRIO_DESTINATARIO ASC ";
            if(vozClienteDto.getOrderBy().equals(VozClienteSource.getInstance().getVozClienteSetupKey("orderByCantidad")))
            {
                orderBy = "ORDER BY CANTIDAD DESC ";
            }
            
            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            /////// Para sacar de distribucion externa, Todos, distribucion Computec
            String filterDistribucion = "";
            if(vozClienteDto.getDistribucionExterna() != null && !vozClienteDto.getDistribucionExterna().equals(""))
            {
                if( vozClienteDto.getDistribucionExterna().equals(constantesGenerales.CODIGO_DISTRIBUCION_EXTERNA) )
                {
                    filterDistribucion += "AND DVC.CODIGO_GESTION = " + constantesGenerales.CODIGO_DISTRIBUCION_EXTERNA + " ";
                }   
                else
                {
                    filterDistribucion += "AND DVC.CODIGO_GESTION != " + constantesGenerales.CODIGO_DISTRIBUCION_EXTERNA + " ";
                }
                 
            }
            
            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            /////// Para sacar desde cuando voy a hacer el barrido de los registros
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.YEAR, vozClienteDto.getYear().intValue());
            calendar.set(Calendar.MONTH, vozClienteDto.getMonth().intValue() - 1);
            calendar.set(Calendar.WEEK_OF_MONTH, vozClienteDto.getMonthWeek().intValue());
            calendar.add(Calendar.WEEK_OF_YEAR,-constantesGenerales.WEEKS_BACK);
            calendar.setFirstDayOfWeek(Calendar.MONDAY);
            calendar.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);

            int year1 = calendar.get(java.util.Calendar.YEAR);
            int month1 = calendar.get(java.util.Calendar.MONTH) + 1;
            int monthWeek1 = calendar.get(java.util.Calendar.WEEK_OF_MONTH);
            
            int primeraFecha = (year1 * 1000) + (month1 * 10) + monthWeek1;
            int segundaFecha = (vozClienteDto.getYear().intValue() * 1000) + (vozClienteDto.getMonth().intValue() * 10) + vozClienteDto.getMonthWeek().intValue();
            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
            
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT DVC.CODIGO_VOZ_CLIENTE, DVC.CODIGO_DEPARTAMENTO, DVC.CODIGO_MUNICIPIO, DVC.CODIGO_CENTROP, DVC.BARRIO_DESTINATARIO, " +
                                                    "D.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, CP.NOMBRE_CENTRO_POBLADO, COUNT(DVC.BARRIO_DESTINATARIO) AS CANTIDAD " +
                                             "FROM "+ SCHEMA +".CARGUE_VOZ_CLIENTE CVC " +
                                             "INNER JOIN "+ SCHEMA +".DETALLE_VOZ_CLIENTE DVC ON DVC.CODIGO_VOZ_CLIENTE = CVC.CODIGO_VOZ_CLIENTE " +
                                             "INNER JOIN "+ SCHEMA +".DEPARTAMENTO D ON D.CODIGO_DEPARTAMENTO = DVC.CODIGO_DEPARTAMENTO " +
                                             "INNER JOIN "+ SCHEMA +".MUNICIPIO M ON M.CODIGO_MUNICIPIO = DVC.CODIGO_MUNICIPIO AND M.CODIGO_DEPARTAMENTO = DVC.CODIGO_DEPARTAMENTO " +
                                             "INNER JOIN "+ SCHEMA +".CENTRO_POBLADO CP ON CP.CODIGO_MUNICIPIO = DVC.CODIGO_MUNICIPIO AND CP.CODIGO_CENTROP = DVC.CODIGO_CENTROP  AND CP.CODIGO_DEPARTAMENTO = DVC.CODIGO_DEPARTAMENTO " +
                                             "WHERE CVC.CODIGO_CLIENTE = ? AND CVC.CODIGO_PRODUCTO = ? AND CVC.ANO = ? AND CVC.MES = ? AND CVC.SEMANA_MES = ? " + filterDepto + filterDistribucion + 
                                             "GROUP BY DVC.CODIGO_VOZ_CLIENTE, DVC.CODIGO_DEPARTAMENTO, DVC.CODIGO_MUNICIPIO, DVC.CODIGO_CENTROP, DVC.BARRIO_DESTINATARIO, " +
                                                      "D.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, CP.NOMBRE_CENTRO_POBLADO " +
                                             orderBy);   
            
            statement2 = con.prepareStatement("SELECT COUNT(DVC.BARRIO_DESTINATARIO) " +
                                              "FROM "+ SCHEMA +".CARGUE_VOZ_CLIENTE CVC " +
                                             "INNER JOIN "+ SCHEMA +".DETALLE_VOZ_CLIENTE DVC ON DVC.CODIGO_VOZ_CLIENTE = CVC.CODIGO_VOZ_CLIENTE " +
                                             "WHERE CVC.CODIGO_CLIENTE = " + vozClienteDto.getCodigoCliente() + " AND CVC.CODIGO_PRODUCTO = " + vozClienteDto.getCodigoProducto() + " AND " +
                                                   "DVC.CODIGO_DEPARTAMENTO = ? AND  DVC.CODIGO_MUNICIPIO = ? AND DVC.CODIGO_CENTROP = ? AND DVC.BARRIO_DESTINATARIO = ? AND " +
                                                   "CVC.ANO * 1000 + CVC.MES * 10 + CVC.SEMANA_MES >= " + primeraFecha + " AND " +
                                                   "CVC.ANO * 1000 + CVC.MES * 10 + CVC.SEMANA_MES <= " + segundaFecha + " " +
                                                   filterDistribucion + 
                                             "GROUP BY DVC.CODIGO_VOZ_CLIENTE, DVC.CODIGO_DEPARTAMENTO, DVC.CODIGO_MUNICIPIO, DVC.CODIGO_CENTROP, DVC.BARRIO_DESTINATARIO "); 

            int indice = 0;
            statement.setObject(++indice, vozClienteDto.getCodigoCliente());
            statement.setObject(++indice, vozClienteDto.getCodigoProducto());
            statement.setObject(++indice, vozClienteDto.getYear() );
            statement.setObject(++indice, vozClienteDto.getMonth() );
            statement.setObject(++indice, vozClienteDto.getMonthWeek() );
            rs = statement.executeQuery();

            while (rs.next()) 
            {
                DetalleVozClienteDto detalleVozClienteDto = new DetalleVozClienteDto();
                int indice1 = 0;
                detalleVozClienteDto.setCodigoVozCliente(rs.getString(++indice1));
                detalleVozClienteDto.setCodigoDepartamento(rs.getString(++indice1));
                detalleVozClienteDto.setCodigoMunicipio(rs.getString(++indice1));
                detalleVozClienteDto.setCodigoCentroP(rs.getString(++indice1));
                detalleVozClienteDto.setBarrio(rs.getString(++indice1));
                
                detalleVozClienteDto.setNombreDepartamento(rs.getString(++indice1));
                detalleVozClienteDto.setNombreMunicipio(rs.getString(++indice1));
                detalleVozClienteDto.setNombreCentroP(rs.getString(++indice1));
                detalleVozClienteDto.setNumeroReclamosSitio(rs.getInt(++indice1));                
                try
                {
                    String pathAlarma = this.buscarAlarma(con, statement2,  rs2, detalleVozClienteDto);
                    detalleVozClienteDto.setPathImagenAlarma( pathAlarma );
                    
                    if( pathAlarma.equals(CoreSource.getInstance().getUtilidadesSetupKey("redBallImg")) ) 
                    {
                        detalleVozClienteDto.setTipoAlarma("3");
                        detalleVozClienteDto.setNombreAlarma(vozClienteSource.getVozClienteSetupKey("tipoAlarma_3"));
                    }
                    else if( pathAlarma.equals(CoreSource.getInstance().getUtilidadesSetupKey("yellowBallImg")) ) 
                    {
                        detalleVozClienteDto.setTipoAlarma("2");
                        detalleVozClienteDto.setNombreAlarma(vozClienteSource.getVozClienteSetupKey("tipoAlarma_2"));
                    }
                    else if( pathAlarma.equals(CoreSource.getInstance().getUtilidadesSetupKey("greenBallImg")) )   
                    {
                        detalleVozClienteDto.setTipoAlarma("1");
                        detalleVozClienteDto.setNombreAlarma(vozClienteSource.getVozClienteSetupKey("tipoAlarma_1"));
                    }   
                    else
                    {
                        detalleVozClienteDto.setTipoAlarma("1");
                        detalleVozClienteDto.setNombreAlarma(vozClienteSource.getVozClienteSetupKey("tipoAlarma_1"));
                    }
                        
                }
                catch(SQLException e)
                {
                    detalleVozClienteDto.setPathImagenAlarma( CoreSource.getInstance().getUtilidadesSetupKey("greenBallImg") );
                    System.out.println("VozClienteDAO:getReclamosVozClienteByFilter: buscarAlarma: " + e.toString());
                    e.printStackTrace();
                }
                
                //Para mirar si anexo o no el dto
                if(vozClienteDto.getAlarma() != null && !vozClienteDto.getAlarma().equals("") )
                {
                    if( vozClienteDto.getAlarma().equals( detalleVozClienteDto.getTipoAlarma() ) )
                    {
                        retorno.add(detalleVozClienteDto);
                    }
                }
                else
                {
                    retorno.add(detalleVozClienteDto);
                }
            }            
        } 
        catch (SQLException e) 
        {
            throw new DAOException("VozClienteDAO:getReclamosVozClienteByFilter: " + e.toString(), e);
        }
        finally 
        {
            closeConnection(statement2, rs2);
            closeConnection(con, statement, rs);
        }
        return retorno;
    }
    
    private String buscarAlarma(Connection con, PreparedStatement statement2, ResultSet rs2, DetalleVozClienteDto detalleVozClienteDto) throws SQLException
    {
        String pathImagenAlarma = "";
        int indice = 0;
        statement2.setObject(++indice, detalleVozClienteDto.getCodigoDepartamento());        
        statement2.setObject(++indice, detalleVozClienteDto.getCodigoMunicipio());        
        statement2.setObject(++indice, detalleVozClienteDto.getCodigoCentroP());        
        statement2.setObject(++indice, detalleVozClienteDto.getBarrio());     
        rs2 = statement2.executeQuery();
        
        double numeroPuntos = constantesGenerales.WEEKS_BACK + 1;
        double sumaTotalSemanas = 0;
        double sumaCuadradosTotalSemanas = 0;
        
        while(rs2.next())
        {
            int indice1 = 0;
            double valorSemana = rs2.getString(++indice1) != null? rs2.getDouble(indice1): 0;
            sumaTotalSemanas += valorSemana;
            sumaCuadradosTotalSemanas += (valorSemana * valorSemana);            
        }
        
        double promedio = sumaTotalSemanas / numeroPuntos;
              
        if(((double)detalleVozClienteDto.getNumeroReclamosSitio()) <= promedio)
        {
            pathImagenAlarma = CoreSource.getInstance().getUtilidadesSetupKey("greenBallImg");
        }
        else
        {
            //Calcular desviacionEstandar
            double desviacionEstandar = Math.sqrt( ( numeroPuntos * sumaCuadradosTotalSemanas - (Math.pow(sumaTotalSemanas,2)) ) / (Math.pow(numeroPuntos,2) ) );              
            
            if( promedio < ((double)detalleVozClienteDto.getNumeroReclamosSitio()) && 
                ((double)detalleVozClienteDto.getNumeroReclamosSitio()) <= (promedio + (2 * desviacionEstandar)) )
            {
                pathImagenAlarma = CoreSource.getInstance().getUtilidadesSetupKey("yellowBallImg");  
                
            }
            else if( (promedio + (2 * desviacionEstandar)) < ((double)detalleVozClienteDto.getNumeroReclamosSitio()) )
            {
                pathImagenAlarma = CoreSource.getInstance().getUtilidadesSetupKey("redBallImg");
                
            }
            else
            {
                pathImagenAlarma = CoreSource.getInstance().getUtilidadesSetupKey("greenBallImg");
            }            
        }
        return pathImagenAlarma;
    } 
    
    public List getDetallesVozClienteSitio(DetalleVozClienteDto detalleVozClienteDto) throws DAOException
    {
        List retorno = new ArrayList();
        
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        
        try 
        {
            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            /////// Para sacar de distribucion externa, Todos, distribucion Computec
            String filterDistribucion = "";
            if(detalleVozClienteDto.getDistribucionExterna() != null && !detalleVozClienteDto.getDistribucionExterna().equals(""))
            {
                if( detalleVozClienteDto.getDistribucionExterna().equals(constantesGenerales.CODIGO_DISTRIBUCION_EXTERNA) )
                {
                    filterDistribucion += "AND DVC.CODIGO_GESTION = " + constantesGenerales.CODIGO_DISTRIBUCION_EXTERNA + " ";
                }   
                else
                {
                    filterDistribucion += "AND DVC.CODIGO_GESTION != " + constantesGenerales.CODIGO_DISTRIBUCION_EXTERNA + " ";
                }
                 
            }
            
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT DVC.CODIGO_INTERNO_CLIENTE, DVC.CODIGO_BARRAS, DVC.CONTACTO, DVC.DESCRIPCION, " +
                                                    "P.RAZON_SOCIAL, ND.NOMBRE_NODO, GE.NOMBRE_GESTION, " +
                                                    "E.NUMERO_ORDEN, E.FECHA_ULTIMA_GESTION, E.FECHA_PROCESO, E.PATH_IMAGEN, " +
                                                    "E.NOMBRE_DESTINATARIO, E.DIRECCION_DESTINATARIO, E.TELEFONO_DESTINATARIO, E.NUMERO_IDENTIFICACION " +
                                             "FROM "+ SCHEMA +".DETALLE_VOZ_CLIENTE DVC " +
                                             "INNER JOIN "+ SCHEMA +".ENVIO E ON E.CODIGO_BARRAS = DVC.CODIGO_BARRAS " +
                                             "INNER JOIN "+ SCHEMA +".NODO_DISTRIBUCION ND ON ND.CODIGO_NODO = E.CODIGO_NODO " +
                                             "INNER JOIN "+ SCHEMA +".PROVEEDOR P ON P.CODIGO_PROVEEDOR = ND.CODIGO_PROVEEDOR " +
                                             "INNER JOIN "+ SCHEMA +".GESTION_ENVIO GE ON GE.CODIGO_GESTION = E.CODIGO_ULTIMA_GESTION " +
                                             "WHERE DVC.CODIGO_VOZ_CLIENTE = ? AND DVC.CODIGO_DEPARTAMENTO = ? AND DVC.CODIGO_MUNICIPIO = ? AND DVC.CODIGO_CENTROP = ? AND DVC.BARRIO_DESTINATARIO = ? " +
                                             filterDistribucion);   

            int indice = 0;
            statement.setObject(++indice, detalleVozClienteDto.getCodigoVozCliente());
            statement.setObject(++indice, detalleVozClienteDto.getCodigoDepartamento());
            statement.setObject(++indice, detalleVozClienteDto.getCodigoMunicipio() );
            statement.setObject(++indice, detalleVozClienteDto.getCodigoCentroP() );
            statement.setObject(++indice, detalleVozClienteDto.getBarrio() );
            rs = statement.executeQuery();

            while (rs.next()) 
            {
                DetalleVozClienteDto dto = new DetalleVozClienteDto();
                int indice1 = 0;
                dto.setCodigoInternoCliente(rs.getString(++indice1));
                dto.setCodigoBarras(rs.getString(++indice1));
                dto.setContacto(rs.getString(++indice1));
                dto.setDescripcion(rs.getString(++indice1));
                dto.setNombreProveedor(rs.getString(++indice1));                
                dto.setNombreNodo(rs.getString(++indice1));
                dto.setNombreGestion(rs.getString(++indice1));
                dto.setNumeroOrden(rs.getString(++indice1));                
                dto.setFechaUltimaGestion(rs.getDate(++indice1) != null ? constantesGenerales.DATE_FORMAT_STRING.format(rs.getDate(indice1)): "");
                dto.setFechaProceso(rs.getDate(++indice1) != null ? constantesGenerales.DATE_FORMAT_STRING.format(rs.getDate(indice1)): "");           
                dto.setPathImagenGuia(rs.getString(++indice1));
                dto.setHasImagenGuia( dto.getPathImagenGuia() != null? true: false );
                dto.setNombreDestinatario(rs.getString(++indice1));                
                dto.setDireccionDestinatario(rs.getString(++indice1));
                dto.setTelefonoDestinatario(rs.getString(++indice1));
                dto.setNumeroIdentificacion(rs.getString(++indice1));
                
                dto.setCodigoVozCliente(detalleVozClienteDto.getCodigoVozCliente());
                dto.setCodigoDepartamento(detalleVozClienteDto.getCodigoDepartamento());
                dto.setCodigoMunicipio(detalleVozClienteDto.getCodigoMunicipio() );
                dto.setCodigoCentroP(detalleVozClienteDto.getCodigoCentroP() );
                dto.setBarrio(detalleVozClienteDto.getBarrio() );
                
                retorno.add(dto);
            }            
        } 
        catch (SQLException e) 
        {
            throw new DAOException("VozClienteDAO:getDetallesVozClienteSitio: " + e.toString(), e);
        }
        finally 
        {
            closeConnection(con, statement, rs);
        }
        return retorno;
    }   
    
    public void generarArchivoDetallesVozCliente(List detallesVozCliente, String ldapUser) throws DAOException
    {
        if(!detallesVozCliente.isEmpty())
        {
            DetalleVozClienteDto dtoAux = (DetalleVozClienteDto)detallesVozCliente.get(0);
                    
            Connection con = null;
            PreparedStatement statement = null;
            PreparedStatement statement2 = null;
            ResultSet rs = null;

            try 
            {
                con = getConnectionDB2();
                statement = con.prepareStatement("SELECT C.RAZON_SOCIAL, P.DESCRIPCION_PRODUCTO, D.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, CP.NOMBRE_CENTRO_POBLADO " +
                        "FROM "+ SCHEMA +".CARGUE_VOZ_CLIENTE CVC " +
                        "INNER JOIN "+ SCHEMA +".DETALLE_VOZ_CLIENTE DVC ON DVC.CODIGO_VOZ_CLIENTE = CVC.CODIGO_VOZ_CLIENTE " +
                        "INNER JOIN "+ SCHEMA +".CLIENTE C ON C.CODIGO_CLIENTE = CVC.CODIGO_CLIENTE " +
                        "INNER JOIN "+ SCHEMA +".PRODUCTO P ON P.CODIGO_CLIENTE = CVC.CODIGO_CLIENTE AND P.CODIGO_PRODUCTO = CVC.CODIGO_PRODUCTO " +
                        "INNER JOIN "+ SCHEMA +".DEPARTAMENTO D ON D.CODIGO_DEPARTAMENTO = DVC.CODIGO_DEPARTAMENTO " +
                        "INNER JOIN "+ SCHEMA +".MUNICIPIO M ON M.CODIGO_MUNICIPIO = DVC.CODIGO_MUNICIPIO AND M.CODIGO_DEPARTAMENTO = DVC.CODIGO_DEPARTAMENTO " +
                        "INNER JOIN "+ SCHEMA +".CENTRO_POBLADO CP ON CP.CODIGO_MUNICIPIO = DVC.CODIGO_MUNICIPIO AND CP.CODIGO_CENTROP = DVC.CODIGO_CENTROP  AND CP.CODIGO_DEPARTAMENTO = DVC.CODIGO_DEPARTAMENTO " +
                        "WHERE CVC.CODIGO_VOZ_CLIENTE = ? AND CP.CODIGO_MUNICIPIO = ? AND CP.CODIGO_CENTROP = ? AND CP.CODIGO_DEPARTAMENTO = ? AND DVC.BARRIO_DESTINATARIO = ? " +
                        "GROUP BY C.RAZON_SOCIAL, P.DESCRIPCION_PRODUCTO, D.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, CP.NOMBRE_CENTRO_POBLADO ");   
                
                statement2 = con.prepareStatement("INSERT INTO " + SCHEMA + ".MENSAJE_ALERTA (CODIGO_TIPO_ARCHIVO, CODIGO_RESPONSABLE, DESCRIPCION_MENSAJE_ALERTA, ORIGEN_MENSAJE_ALERTA, PATH_MENSAJE_ALERTA, FECHA_REGISTRO, ESTADO) " +
                                                  "VALUES (?, ?, ?, ?, ?, ?, ?)");

                int indice = 0;
                statement.setObject(++indice, dtoAux.getCodigoVozCliente());
                statement.setObject(++indice, dtoAux.getCodigoMunicipio());
                statement.setObject(++indice, dtoAux.getCodigoCentroP() );
                statement.setObject(++indice, dtoAux.getCodigoDepartamento() );
                statement.setObject(++indice, dtoAux.getBarrio() );
                rs = statement.executeQuery();
                    
                DetalleVozClienteDto dtoInfoExtraFile = new DetalleVozClienteDto();
                
                if (rs.next()) 
                {
                     int indice1 = 0;
                     dtoInfoExtraFile.setNombreCliente(rs.getString(++indice1));
                     dtoInfoExtraFile.setNombreProducto(rs.getString(++indice1));
                     dtoInfoExtraFile.setNombreDepartamento(rs.getString(++indice1));
                     dtoInfoExtraFile.setNombreMunicipio(rs.getString(++indice1));
                     dtoInfoExtraFile.setNombreCentroP(rs.getString(++indice1));                    
                }
                
                String fileName = "VC_" + constantesGenerales.RANDOM_STRING_UTILS.randomAlphanumeric(20) + constantesGenerales.FILE_EXTENSION;
                
                Thread thread = new Thread(new FileThread(FileThread.FILE_DETALLES, fileName, dtoInfoExtraFile, detallesVozCliente));
                thread.start();
                
                indice = 0;
                statement2.setObject(++indice, constantesGenerales.FILE_CODE);
                statement2.setObject(++indice, ldapUser);
                statement2.setObject(++indice, "NRO RECLAMOS: " + detallesVozCliente.size()  + ". " + dtoInfoExtraFile.getNombreCliente() + " - " + dtoInfoExtraFile.getNombreProducto() + ". UBICACION: " + 
                                               dtoInfoExtraFile.getNombreDepartamento() + " " + dtoInfoExtraFile.getNombreCentroP() + " - " + dtoAux.getBarrio());
                statement2.setObject(++indice, constantesGenerales.FILE_ORIGEN);
                statement2.setObject(++indice, fileName);
                statement2.setTimestamp(++indice, new Timestamp((new Date()).getTime()));
                statement2.setObject(++indice, constantesGenerales.FILE_ACTIVE);
                statement2.executeUpdate();
            } 
            catch (SQLException e) 
            {
                throw new DAOException("VozClienteDAO:getDetallesVozClienteSitio: " + e.toString(), e);
            }
            finally 
            {
                closeConnection(statement, rs);
                closeConnection(con, statement2);
            }
        }
    }
    
    
    public List getDepartamentos() throws DAOException {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT CODIGO_DEPARTAMENTO, NOMBRE_DEPARTAMENTO " +
                    "FROM " + SCHEMA + ".DEPARTAMENTO " +
                    "ORDER BY NOMBRE_DEPARTAMENTO ASC");
            rs = statement.executeQuery();
            
            while (rs.next()) 
            {
                int indice1 = 0;
                DepartamentoDto departamentoDto = new DepartamentoDto();
                departamentoDto.setCodigoDepartamento(rs.getString(++indice1));
                departamentoDto.setNombreDepartamento(rs.getString(++indice1));
                retornoLst.add(departamentoDto);
            }
        }
        catch (SQLException e) 
        {
            throw new DAOException("NoClassDAO:getDepartamentos: " + e.toString(), e);
        } 
        finally 
        {
            closeConnection(con, statement, rs);
        }
        return retornoLst;
    }
    
    public List getMunicipiosByDepartamento(DepartamentoDto departamentoDto) throws DAOException {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT  CP.CODIGO_DEPARTAMENTO, CP.CODIGO_MUNICIPIO, CP.CODIGO_CENTROP, M.NOMBRE_MUNICIPIO, CP.NOMBRE_CENTRO_POBLADO " +
                    "FROM " + SCHEMA + ".CENTRO_POBLADO CP " +
                    "INNER JOIN " + SCHEMA + ".MUNICIPIO M ON CP.CODIGO_DEPARTAMENTO = M.CODIGO_DEPARTAMENTO AND CP.CODIGO_MUNICIPIO = M.CODIGO_MUNICIPIO " +
                    "WHERE CP.CODIGO_DEPARTAMENTO = ? " +
                    "ORDER BY CP.NOMBRE_CENTRO_POBLADO, M.NOMBRE_MUNICIPIO  ASC ");
            
            int indice=0;
            
            statement.setObject(++indice, departamentoDto.getCodigoDepartamento());
            rs = statement.executeQuery();
            
            while (rs.next()) {
                int indice1 = 0;
                MunicipioCentroPobladoDto dto = new MunicipioCentroPobladoDto();
                dto.setCodigoDepartamento(rs.getString(++indice1));
                dto.setCodigoMunicipio(rs.getString(++indice1));
                dto.setCodigoCentroP(rs.getString(++indice1));
                dto.setNombreMunicipio(rs.getString(++indice1));
                dto.setNombreCentroP(rs.getString(++indice1));
                retornoLst.add(dto);
            }
        } catch (SQLException e) {
            throw new DAOException("NoClassDAO:getMunicipiosByDepartamento: " + e.toString(), e);
        } finally {
            closeConnection(con, statement, rs);
        }
        return retornoLst;
    }
    
    public void generarArchivoGeneralVozCliente(List generalVozCliente, String ldapUser) throws DAOException
    {
        if(!generalVozCliente.isEmpty())
        {
            DetalleVozClienteDto dtoAux = (DetalleVozClienteDto)generalVozCliente.get(0);
                    
            Connection con = null;
            PreparedStatement statement = null;
            PreparedStatement statement2 = null;
            ResultSet rs = null;

            try 
            {
                con = getConnectionDB2();
                statement = con.prepareStatement("SELECT C.RAZON_SOCIAL, P.DESCRIPCION_PRODUCTO " +
                        "FROM "+ SCHEMA +".CARGUE_VOZ_CLIENTE CVC " +
                        "INNER JOIN "+ SCHEMA +".CLIENTE C ON C.CODIGO_CLIENTE = CVC.CODIGO_CLIENTE " +
                        "INNER JOIN "+ SCHEMA +".PRODUCTO P ON P.CODIGO_CLIENTE = CVC.CODIGO_CLIENTE AND P.CODIGO_PRODUCTO = CVC.CODIGO_PRODUCTO " +
                        "WHERE CVC.CODIGO_VOZ_CLIENTE = ? ");   
                
                statement2 = con.prepareStatement("INSERT INTO " + SCHEMA + ".MENSAJE_ALERTA (CODIGO_TIPO_ARCHIVO, CODIGO_RESPONSABLE, DESCRIPCION_MENSAJE_ALERTA, ORIGEN_MENSAJE_ALERTA, PATH_MENSAJE_ALERTA, FECHA_REGISTRO, ESTADO) " +
                                                  "VALUES (?, ?, ?, ?, ?, ?, ?)");

                int indice = 0;
                statement.setObject(++indice, dtoAux.getCodigoVozCliente());
                rs = statement.executeQuery();
                    
                DetalleVozClienteDto dtoInfoExtraFile = new DetalleVozClienteDto();
                
                if (rs.next()) 
                {
                     int indice1 = 0;
                     dtoInfoExtraFile.setNombreCliente(rs.getString(++indice1));
                     dtoInfoExtraFile.setNombreProducto(rs.getString(++indice1));                       
                }
                
                String fileName = "VC_" + constantesGenerales.RANDOM_STRING_UTILS.randomAlphanumeric(20) + constantesGenerales.FILE_EXTENSION;
                
                Thread thread = new Thread(new FileThread(FileThread.FILE_GENERAL, fileName, dtoInfoExtraFile, generalVozCliente));
                thread.start();
                
                indice = 0;
                statement2.setObject(++indice, constantesGenerales.FILE_CODE);
                statement2.setObject(++indice, ldapUser);
                statement2.setObject(++indice, "LISTADO FILTRADO: " + generalVozCliente.size()  + ". " + dtoInfoExtraFile.getNombreCliente() + " - " + dtoInfoExtraFile.getNombreProducto() + ".");
                statement2.setObject(++indice, constantesGenerales.FILE_ORIGEN);
                statement2.setObject(++indice, fileName);
                statement2.setTimestamp(++indice, new Timestamp((new Date()).getTime()));
                statement2.setObject(++indice, constantesGenerales.FILE_ACTIVE);
                statement2.executeUpdate();
            } 
            catch (SQLException e) 
            {
                throw new DAOException("VozClienteDAO:getDetallesVozClienteSitio: " + e.toString(), e);
            }
            finally 
            {
                closeConnection(statement, rs);
                closeConnection(con, statement2);
            }
        }
    }
}
